package main

import (
	"context"
	"fmt"
)

type handler func(context.Context)

type interceptor func(context.Context, handler)

// 第一个版本的拦截器可以看出实际运行的任务跑了两次.
// 未能达到预期

func main() {

	interceptors := make([]interceptor, 0)

	task := func(ctx context.Context) {
		fmt.Println("do job")
	}

	in1 := func(ctx context.Context, h handler) {
		fmt.Println("start1")
		h(ctx)
	}
	in2 := func(ctx context.Context, h handler) {
		fmt.Println("start2")
		h(ctx)
	}

	interceptors = append(interceptors, in1)
	interceptors = append(interceptors, in2)
	todo := context.TODO()
	for _, in := range interceptors {
		in(todo, task)
	}

}
